草庐IT

C++ Templates 多态障碍

全部标签

当(看似)没有障碍时,作曲家为什么说“结论:不要安装”?

以下composer.json:{"type":"project","minimum-stability":"dev","require":{"jasny/bootstrap":">=3.1.3","2amigos/yii2-file-input-widget":"*"}}导致以下输出composerupdate:LoadingcomposerrepositorieswithpackageinformationUpdatingdependencies(includingrequire-dev)Yourrequirementscouldnotberesolvedtoaninstallablese

c++ - std::map 和 -fno-implicit-templates

我正在尝试使用g++4.4进行编译并链接一个使用STL的简单程序。我正在尝试使用-fno-implicit-templates来做到这一点,因此必须显式实例化所有模板。我不明白为什么此代码有效:#include//templateclassstd::map;templateclassstd::_Rb_tree,std::_Select1st>,std::less,std::allocator>>;intmain(){std::maptable;return0;}我希望这个程序需要这一行:templateclassstd::map;,但是该行不会使程序链接。std::_Rb_treeli

C++、多态和迭代器

我想要一个存储接口(interface)(抽象类)和一组存储实现(SQLite、MySQL、Memcached..),用于存储已知类的对象并从存储中检索子集。对我来说,清晰的界面是:classStorable{intid;blah;blah;blah;stringtype;};classStorage{virtualStorage::iteratorget_subset_of_type(stringtype)=0;virtualStorage::iteratorend)_=0;virtualvoidadd_storable(Storablestorable)=0;};然后创建实现接口(

Java中使用Lambda表达式实现多态性和动态分派

Java中使用Lambda表达式实现多态性(Polymorphism)在Java中,Lambda表达式本身并不直接实现多态性,因为多态性主要是通过类的继承和方法的重写(override)来实现的。但是,Lambda表达式可以与接口和方法引用一起使用,来模拟多态性的某些方面,特别是当接口有多个实现时。下面是一个使用Lambda表达式和方法引用来实现多态性的例子:importjava.util.function.Consumer;//定义一个函数式接口interfaceAnimalSound{voidmakeSound();}//实现该接口的类classDogimplementsAnimalSou

c++ - dynamic_cast 不适用于非多态类型的原因

对于类B和派生类D:classB{intb;};classD:publicB{intd;};D*d=newD();B*b=dynamic_cast(d);上面的代码可以正常工作——这是一个简单的向上转换。我们确信无论b指向什么,它都有B类(子)对象。但是,B*b=newD();D*d=dynamic_cast(b);不会编译,即使b指向一个有效的D实例——因为基类不是多态的。所以只添加一个空虚方法就可以解决问题。重要的问题是为什么C++要求源类型是多态的?我找到的唯一解释是this,但它只是说“因为这就是它在内部实现的方式”——至少在我看来是这样)。设计dynamic_cast的人可能

c++ - C++ 中多态对象列表的最佳实践

存储基类指针列表的常见做法是什么,每个基类指针都可以描述一个多态派生类?为了详细说明并考虑一个简单的示例,让我们假设我有一组具有以下目标的类:一个抽象基类,其目的是在其派生类上强制执行通用功能。一组派生类:可以执行通用功能、本质上可复制(这很重要)并且可序列化。现在除了这个必需的功能之外,我还想解决以下关键点:我希望这个系统的使用是安全的;我不希望用户在错误地将基类指针转换为错误的派生类型时出现未定义的错误。此外,我希望尽可能多地自动处理复制/序列化此列表的工作。这样做的原因是,随着新的派生类型的添加,我不想搜索许多源文件并确保所有内容都兼容。下面的代码演示了一个简单的例子,以及我提出

c++ - 模板中的多态类

假设我们有一个类层次结构,其中我们有一个通用的Animal类,它有几个直接继承自它的类(例如Dog、Cat、Horse等)。在此继承层次结构上使用模板时,仅使用SomeTemplateClass是否合法?然后将DogsandCatsandHorses放入这个模板对象中?例如,假设我们有一个模板化的Stack类,我们想在这里接待各种动物。我可以简单地说Stacks;Dogd;s.push(d);Catc;s.push(c);吗? 最佳答案 如果否,请回答您的问题。但您可以使用SomeTemplateClass并将派生类的对象指针传递给

c++ - 多态性和默认值 : can co-exist?

这个问题在这里已经有了答案:virtualfunctiondefaultargumentsbehaviour(7个答案)关闭8年前。我有一个包含许多继承派生类的基类。像这样:classA{public:virtualvoidf(stringfoo="bar"){cout为简洁起见,我只继承了两个类。这是主要的:A*aArray[]={newB,newC,};intmain(){aArray[0]->f();aArray[0]->f();return0;}当我运行程序时,我得到的输出是:barbar就像编译器忽略重写函数的默认参数一样。这是正常现象,还是我做错了什么或遗漏了什么?

c++ - 如何在没有多态效果的情况下调用虚方法?

我有引用ref:Foo&ref=..我想调用一个方法ref.say(),它在Foo中被定义为虚拟的,我确信它在子类中被覆盖了(因为我也写了它们)。但是我想调用say就好像它不是不是多态的,所以版本是在Foo中定义的,而不是在子类中定义的。怎么做?我想到的一件事是采用ref的指针,而不是取消引用它,这个技巧应该会杀死多态性,但我不确定这是否能保证达到预期的效果。请注意,我没有坐在Foo或其任何子节点中,Foo树是我当前POV的外部结构。 最佳答案 怎么样ref.Foo::say();这就是你要找的?

C++多态和虚函数

是否可以从B调用虚函数foo(int)而无需使用注释中的内容?classA{public:virtualvoidfoo(char*){}virtualvoidfoo(int){}};classB:publicA{public:voidfoo(char*){}//voidfoo(inti){////A::foo(i);//}};Bb;b.foo(123);//cannotconvertargument1from'int'to'char*' 最佳答案 是的,这是可能的。这里的问题是函数B::foo(char*)隐藏继承函数A::foo(